home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_077 / samples / ttt.d < prev    next >
Text File  |  1992-05-06  |  4KB  |  198 lines

  1. ushort
  2.     W1 = 1,
  3.     W2 = 5,
  4.     W3 = 25;
  5.  
  6. type
  7.     TTTMOVE = enum {TTT_EMPTY, TTT_X, TTT_O};
  8.  
  9. [3, 3] TTTMOVE TTTBoard;
  10. [3] ushort TTTValue;
  11.  
  12. proc initBoard()void:
  13.     ushort r, c;
  14.  
  15.     for r from 0 upto 2 do
  16.     for c from 0 upto 2 do
  17.         TTTBoard[r, c] := TTT_EMPTY;
  18.     od;
  19.     od;
  20. corp;
  21.  
  22. proc eval(TTTMOVE player)short:
  23.     short score;
  24.     ushort i, j, count1, count2, count3, count4;
  25.  
  26.     score := 0;
  27.     count3 := 0;
  28.     count4 := 0;
  29.     for i from 0 upto 2 do
  30.     if TTTBoard[i, i] = player then
  31.         count3 := count3 + 1;
  32.     elif TTTBoard[i, i] ~= TTT_EMPTY then
  33.         count3 := 10;
  34.     fi;
  35.     if TTTBoard[i, 2 - i] = player then
  36.         count4 := count4 + 1;
  37.     elif TTTBoard[i, 2 - i] ~= TTT_EMPTY then
  38.         count4 := 10;
  39.     fi;
  40.     count1 := 0;
  41.     count2 := 0;
  42.     for j from 0 upto 2 do
  43.         if TTTBoard[i, j] = player then
  44.         count1 := count1 + 1;
  45.         elif TTTBoard[i, j] ~= TTT_EMPTY then
  46.         count1 := 10;
  47.         fi;
  48.         if TTTBoard[j, i] = player then
  49.         count2 := count2 + 1;
  50.         elif TTTBoard[j, i] ~= TTT_EMPTY then
  51.         count2 := 10;
  52.         fi;
  53.     od;
  54.     if count1 ~= 0 and count1 < 10 then
  55.         score := score + TTTValue[count1 - 1];
  56.     fi;
  57.     if count2 ~= 0 and count2 < 10 then
  58.         score := score + TTTValue[count2 - 1];
  59.     fi;
  60.     od;
  61.     if count3 ~= 0 and count3 < 10 then
  62.     score := score + TTTValue[count3 - 1];
  63.     fi;
  64.     if count4 ~= 0 and count4 < 10 then
  65.     score := score + TTTValue[count4 - 1];
  66.     fi;
  67.     score
  68. corp;
  69.  
  70. proc genMove()void:
  71.     short score1, score2, maxscore;
  72.     ushort i, j, maxi, maxj;
  73.  
  74.     maxscore := -128;
  75.     maxi := 0;
  76.     maxj := 0;
  77.     for i from 0 upto 2 do
  78.     for j from 0 upto 2 do
  79.         if TTTBoard[i, j] = TTT_EMPTY then
  80.         TTTBoard[i, j] := TTT_O;
  81.         score1 := eval(TTT_O);
  82.         if score1 >= W3 then
  83.             score1 := 127;
  84.         else
  85.             score2 := eval(TTT_X);
  86.             TTTBoard[i, j] := TTT_X;
  87.             if eval(TTT_X) >= W3 then
  88.             score1 := 126;
  89.             else
  90.             score1 := score1 - score2;
  91.             fi;
  92.         fi;
  93.         if score1 > maxscore then
  94.             maxscore := score1;
  95.             maxi := i;
  96.             maxj := j;
  97.         fi;
  98.         TTTBoard[i, j] := TTT_EMPTY;
  99.         fi;
  100.     od;
  101.     od;
  102.     writeln("My move is ", maxi * 3 + maxj + 1, ".");
  103.     TTTBoard[maxi, maxj] := TTT_O;
  104. corp;
  105.  
  106. proc printBoard()void:
  107.     ushort r, c;
  108.  
  109.     writeln();
  110.     for r from 0 upto 2 do
  111.     if r ~= 0 then
  112.         writeln("---------");
  113.     fi;
  114.     for c from 0 upto 2 do
  115.         write(
  116.         if TTTBoard[r, c] = TTT_X then
  117.             'X'
  118.         elif TTTBoard[r, c] = TTT_O then
  119.             'O'
  120.         else
  121.             r * 3 + c + '1'
  122.         fi
  123.         );
  124.         if c ~= 2 then
  125.         write(" | ");
  126.         fi;
  127.     od;
  128.     writeln();
  129.     od;
  130.     writeln();
  131. corp;
  132.  
  133. proc play()void:
  134.     ushort r, c, moves;
  135.     char ch;
  136.     bool gameOver;
  137.  
  138.     initBoard();
  139.     gameOver := false;
  140.     moves := 0;
  141.     while not gameOver do
  142.     printBoard();
  143.     while
  144.         write("Your move (1-9)? ");
  145.         if not read(ch) then
  146.         moves := ioerror();
  147.         gameOver := true;
  148.         writeln("Game aborted.");
  149.         false
  150.         elif ch < '1' or ch > '9' then
  151.         true
  152.         else
  153.         r := (ch - '1') / 3;
  154.         c := (ch - '1') - r * 3;
  155.         TTTBoard[r, c] ~= TTT_EMPTY
  156.         fi
  157.     do
  158.         readln();
  159.         writeln("Illegal move - try again.");
  160.     od;
  161.     readln();
  162.     if not gameOver then
  163.         TTTBoard[r, c] := TTT_X;
  164.         moves := moves + 1;
  165.         if eval(TTT_X) >= W3 then
  166.         gameOver := true;
  167.         writeln("You win!");
  168.         elif moves = 9 then
  169.         gameOver := true;
  170.         writeln("Tie game.");
  171.         fi;
  172.     fi;
  173.     if not gameOver then
  174.         genMove();
  175.         moves := moves + 1;
  176.         if eval(TTT_O) >= W3 then
  177.         gameOver := true;
  178.         writeln("I win!");
  179.         fi;
  180.     fi;
  181.     od;
  182. corp;
  183.  
  184. proc main()void:
  185.     char ch;
  186.  
  187.     TTTValue[0] := W1;
  188.     TTTValue[1] := W2;
  189.     TTTValue[2] := W3;
  190.     while
  191.     play();
  192.     writeln();
  193.     write("Play again? (Y/N) ");
  194.     readln(ch) and (ch = 'y' or ch = 'Y')
  195.     do
  196.     od;
  197. corp;
  198.